/* 
 * Copyright 2013 Sébastien Mouquet.
 * 
 * This file is part of ECovoiturage.
 * 
 * ECovoiturage is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * ECovoiturage is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Foobar. If not, see http://www.gnu.org/licenses/.
 */
package com.smouquet.ecovoiturage.ui.page.root;

import com.smouquet.ecovoiturage.core.domain.TrajetCommentaire;
import com.smouquet.ecovoiturage.core.util.DateUtil;
import com.smouquet.ecovoiturage.core.util.DescComparator;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.VerticalLayout;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 *
 * @author sebastien.mouquet
 */
public class TrajetMidiCommentairesList extends VerticalLayout
{
    private List<TrajetCommentaire> commentaires;
    private DateFormat dfDateTime;
    private DateFormat dfDateTimeFull;
    private DateFormat dfTime;
    
    
    public TrajetMidiCommentairesList()
    {
        this.dfDateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
        this.dfDateTimeFull = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
        this.dfTime = DateFormat.getTimeInstance(DateFormat.MEDIUM);
    }
    
    public TrajetMidiCommentairesList(List<TrajetCommentaire> commentaires)
    {
        this();
        this.commentaires = commentaires;
        layout();
    }

    
    public void setCommentaires(List<TrajetCommentaire> commentaires)
    {
        this.commentaires = commentaires;
        layout();
    }
    
    
    private void layout()
    {
        removeAllComponents();
        
        StringBuilder title;
        Panel pnlCommentaire;
        VerticalLayout lytCommentaire;
        Label lbCommentaire;
        
        List<TrajetCommentaire> lstCommentaires = prepareCommentairesList();
        Map<TrajetCommentaire, Alignment> mapAlignement = prepareAlignement(lstCommentaires);
        
        for(TrajetCommentaire commentaire : lstCommentaires)
        {
            lbCommentaire = new Label(commentaire.getCommentaire().replaceAll("\\n", "<br>"), ContentMode.HTML);
            
            lytCommentaire = new VerticalLayout();
            lytCommentaire.setMargin(true);
            lytCommentaire.addComponent(lbCommentaire);
            
            title = new StringBuilder();
            title.append(commentaire.getUtilisateur().getNom());
            title.append(" - ");
            if(DateUtil.isToday(commentaire.getDate())) {
                title.append(dfTime.format(commentaire.getDate().getTime()));
            } else {
                title.append(dfDateTime.format(commentaire.getDate().getTime()));
            }
            
            pnlCommentaire = new Panel(title.toString());
            pnlCommentaire.setWidth(60, Unit.PERCENTAGE);
            pnlCommentaire.setContent(lytCommentaire);
            
            addComponent(pnlCommentaire);
            
            setComponentAlignment(pnlCommentaire, mapAlignement.get(commentaire));
        }
        
        setSpacing(true);
    }
    
    private List<TrajetCommentaire> prepareCommentairesList()
    {
        Map<String, TrajetCommentaire> mapTrajet = new TreeMap<String, TrajetCommentaire>(new DescComparator<String>());
        for(TrajetCommentaire c : commentaires) {
            mapTrajet.put(dfDateTimeFull.format(c.getDate().getTime())+"_"+c.getId().intValue(), c);
        }
        
        return new ArrayList<TrajetCommentaire>(mapTrajet.values());
    }
    
    private Map<TrajetCommentaire, Alignment> prepareAlignement(List<TrajetCommentaire> commentaires)
    {
        Map<TrajetCommentaire, Alignment> map = new HashMap<TrajetCommentaire, Alignment>();
                
        int previousUtilisateurId = -1;
        Alignment alignement = Alignment.MIDDLE_RIGHT;
        TrajetCommentaire commentaire;
        for(int i = (commentaires.size()-1) ; i >= 0 ; i--)
        {
            commentaire = commentaires.get(i);
            
            // Si l'utilisateur ayant écrit ce commentaire n'est
            // pas le même qu'avant, alors on change l'alignement
            if(commentaire.getUtilisateur().getId().intValue() != previousUtilisateurId)
            {
                if(alignement.equals(Alignment.MIDDLE_RIGHT)) {
                    alignement = Alignment.MIDDLE_LEFT;
                } else {
                    alignement = Alignment.MIDDLE_RIGHT;
                }
            }
            previousUtilisateurId = commentaire.getUtilisateur().getId().intValue();
            
            map.put(commentaire, alignement);
        }
        
        return map;
    }
}
